Skip to content

MkDevTools

Show source on GitHub

Node showing information about used dev tools.

Example: From project

Jinja

{{ mk.MkDevTools() }}

Python

MkDevTools()

Pre-Commit

This project uses pre-commit to ensure code quality. A .pre-commit-config.yaml configuration file tailored for this project is provided in the root folder.

# Setup pre-commit hooks for required formatting
pre-commit install
Config
default_language_version:
    python: python3.12
default_stages: [pre-commit]
repos:
    - repo: local
      hooks:
          - id: pytest-check
            name: pytest-check
            entry: uv run pytest
            language: system
            # stages: [push]
            types: [python]
            pass_filenames: false
            always_run: true
    - repo: https://github.com/pre-commit/pre-commit-hooks
      rev: v5.0.0
      hooks:
          # - id: trailing-whitespace
          # - id: check-ast
          - id: check-case-conflict
          - id: check-docstring-first
          - id: check-merge-conflict
          # - id: check-yaml
          - id: check-toml
          - id: check-json
          - id: detect-private-key
          - id: forbid-new-submodules
          # - id: check-added-large-files
    # https://pre-commit.com/hooks.html
    - repo: https://github.com/pre-commit/mirrors-mypy
      rev: v1.13.0
      hooks:
          - id: mypy
            # args: [--ignore-missing-imports]
            additional_dependencies: ["orjson"]

    - repo: https://github.com/charliermarsh/ruff-pre-commit
      rev: v0.7.4
      hooks:
          - id: ruff
          - id: ruff-format

    - repo: https://github.com/commitizen-tools/commitizen
      rev: v3.30.1
      hooks:
          - id: commitizen
            stages: [commit-msg]
            additional_dependencies: [typing-extensions]
Installing Pre-Commit

To install pre-commit:

pip install pre-commit
More information

PyRight

PyRight is used for type checking. You can find the configuration in the pyproject.toml file.

hatch run pyright --help
Config
pythonVersion = "3.12"
pythonPlatform = "All"
reportUnusedCallResult = false
reportUnknownVariableType = false
reportAny = false
reportImplicitOverride = false
reportUnannotatedClassAttribute = false
Installing PyRight

To install pyright:

pip install pyright
More information

MkDocs

Ruff is used as a linter. You can find the configuration in the pyproject.toml file.

hatch run ruff --help
Config
line-length = 90
extend-exclude = [
    "docs",
]
target-version = "py312"

[lint]
preview = true
select = [
    "A",
    "B",
    "BLE",
    "C",
    "C4",
    "COM",
    "D",
    "E",
    "EM",
    "EXE",
    "F",
    "FA",
    "FLY",
    "G",
    "I",
    "ICN",
    "INP",
    "INT",
    "ISC",
    "N",
    "PERF",
    "PIE",
    "PLE",
    "PLC",
    "PLR",
    "PT",
    "PTH",
    "PYI",
    "Q",
    "RET",
    "RSE",
    "RUF",
    "SIM",
    "SLF",
    "SLOT",
    "T10",
    "TCH",
    "TID",
    "TRY",
    "UP",
    "W",
    "YTT",
]
ignore = [
    "C408",
    "B905",
    "C901",
    "D100",
    "D101",
    "D102",
    "D103",
    "D104",
    "D105",
    "D106",
    "D107",
    "D203",
    "D204",
    "D213",
    "D215",
    "D400",
    "D401",
    "D404",
    "D406",
    "D407",
    "D408",
    "D409",
    "D413",
    "N813",
    "PLC0415",
    "PLC2701",
    "PLR0904",
    "PLR0912",
    "PLR0913",
    "PLR0915",
    "PLR0917",
    "PLR6301",
    "SLF001",
    "RUF012",
    "TRY003",
    "COM812",
    "COM819",
    "D206",
    "E501",
    "ISC001",
    "Q000",
    "Q001",
    "Q002",
    "Q003",
    "W191",
]

[lint.flake8-quotes]
docstring-quotes = "double"

[lint.isort]
lines-after-imports = 2
force-sort-within-sections = true
combine-as-imports = true

[lint.per-file-ignores]
"__init__.py" = [
    "E402",
    "I001",
]

[format]
preview = true
docstring-code-format = true
Installing MkDocs

To install mkdocs:

pip install mkdocs
More information

Coverage

Coverage is used to monitor test coverage.

hatch run coverage run some_module.py
Config
[report]
exclude_lines = [
    "pragma: no cover",
    "if TYPE_CHECKING:",
    "@overload",
    "except ImportError",
    "if __name__ == \"__main__\":",
]
Installing Coverage

To install coverage:

pip install coverage
More information

Ruff

Ruff is used as a linter. You can find the configuration in the pyproject.toml file.

hatch run ruff --help
Config
line-length = 90
extend-exclude = [
    "docs",
]
target-version = "py312"

[lint]
preview = true
select = [
    "A",
    "B",
    "BLE",
    "C",
    "C4",
    "COM",
    "D",
    "E",
    "EM",
    "EXE",
    "F",
    "FA",
    "FLY",
    "G",
    "I",
    "ICN",
    "INP",
    "INT",
    "ISC",
    "N",
    "PERF",
    "PIE",
    "PLE",
    "PLC",
    "PLR",
    "PT",
    "PTH",
    "PYI",
    "Q",
    "RET",
    "RSE",
    "RUF",
    "SIM",
    "SLF",
    "SLOT",
    "T10",
    "TCH",
    "TID",
    "TRY",
    "UP",
    "W",
    "YTT",
]
ignore = [
    "C408",
    "B905",
    "C901",
    "D100",
    "D101",
    "D102",
    "D103",
    "D104",
    "D105",
    "D106",
    "D107",
    "D203",
    "D204",
    "D213",
    "D215",
    "D400",
    "D401",
    "D404",
    "D406",
    "D407",
    "D408",
    "D409",
    "D413",
    "N813",
    "PLC0415",
    "PLC2701",
    "PLR0904",
    "PLR0912",
    "PLR0913",
    "PLR0915",
    "PLR0917",
    "PLR6301",
    "SLF001",
    "RUF012",
    "TRY003",
    "COM812",
    "COM819",
    "D206",
    "E501",
    "ISC001",
    "Q000",
    "Q001",
    "Q002",
    "Q003",
    "W191",
]

[lint.flake8-quotes]
docstring-quotes = "double"

[lint.isort]
lines-after-imports = 2
force-sort-within-sections = true
combine-as-imports = true

[lint.per-file-ignores]
"__init__.py" = [
    "E402",
    "I001",
]

[format]
preview = true
docstring-code-format = true
Installing Ruff

To install ruff:

pip install ruff
More information

MyPy

MyPy is used for type checking. You can find the configuration in the pyproject.toml file.

hatch run mypy --help
Config
python_version = "3.12"
disable_error_code = [
    "assignment",
    "misc",
    "import",
    "has-type",
]
check_untyped_defs = true
Installing MyPy

To install mypy:

pip install mypy
More information

## Pre-Commit

This project uses **pre-commit** to ensure code quality.
A `.pre-commit-config.yaml` configuration file tailored for this project is provided
in the root folder.

```` {.md }
# Setup pre-commit hooks for required formatting
pre-commit install
````

??? quote "Config"
    ```` {.yaml }
    default_language_version:
        python: python3.12
    default_stages: [pre-commit]
    repos:
        - repo: local
          hooks:
              - id: pytest-check
                name: pytest-check
                entry: uv run pytest
                language: system
                # stages: [push]
                types: [python]
                pass_filenames: false
                always_run: true
        - repo: https://github.com/pre-commit/pre-commit-hooks
          rev: v5.0.0
          hooks:
              # - id: trailing-whitespace
              # - id: check-ast
              - id: check-case-conflict
              - id: check-docstring-first
              - id: check-merge-conflict
              # - id: check-yaml
              - id: check-toml
              - id: check-json
              - id: detect-private-key
              - id: forbid-new-submodules
              # - id: check-added-large-files
        # https://pre-commit.com/hooks.html
        - repo: https://github.com/pre-commit/mirrors-mypy
          rev: v1.13.0
          hooks:
              - id: mypy
                # args: [--ignore-missing-imports]
                additional_dependencies: ["orjson"]

        - repo: https://github.com/charliermarsh/ruff-pre-commit
          rev: v0.7.4
          hooks:
              - id: ruff
              - id: ruff-format

        - repo: https://github.com/commitizen-tools/commitizen
          rev: v3.30.1
          hooks:
              - id: commitizen
                stages: [commit-msg]
                additional_dependencies: [typing-extensions]

    ````


??? info "Installing Pre-Commit"
    To install pre-commit:
    ```` {.bash }
    pip install pre-commit
    ````
    [More information](https://pre-commit.com)


## PyRight

**PyRight** is used for type checking. You can find the configuration in the
`pyproject.toml` file.


```` {.md }
hatch run pyright --help
````

??? quote "Config"
    ```` {.toml }
    pythonVersion = "3.12"
    pythonPlatform = "All"
    reportUnusedCallResult = false
    reportUnknownVariableType = false
    reportAny = false
    reportImplicitOverride = false
    reportUnannotatedClassAttribute = false

    ````


??? info "Installing PyRight"
    To install pyright:
    ```` {.bash }
    pip install pyright
    ````
    [More information](https://microsoft.github.io/pyright/)


## MkDocs

**Ruff** is used as a linter. You can find the configuration in the
`pyproject.toml` file.


```` {.md }
hatch run ruff --help
````

??? quote "Config"
    ```` {.toml }
    line-length = 90
    extend-exclude = [
        "docs",
    ]
    target-version = "py312"

    [lint]
    preview = true
    select = [
        "A",
        "B",
        "BLE",
        "C",
        "C4",
        "COM",
        "D",
        "E",
        "EM",
        "EXE",
        "F",
        "FA",
        "FLY",
        "G",
        "I",
        "ICN",
        "INP",
        "INT",
        "ISC",
        "N",
        "PERF",
        "PIE",
        "PLE",
        "PLC",
        "PLR",
        "PT",
        "PTH",
        "PYI",
        "Q",
        "RET",
        "RSE",
        "RUF",
        "SIM",
        "SLF",
        "SLOT",
        "T10",
        "TCH",
        "TID",
        "TRY",
        "UP",
        "W",
        "YTT",
    ]
    ignore = [
        "C408",
        "B905",
        "C901",
        "D100",
        "D101",
        "D102",
        "D103",
        "D104",
        "D105",
        "D106",
        "D107",
        "D203",
        "D204",
        "D213",
        "D215",
        "D400",
        "D401",
        "D404",
        "D406",
        "D407",
        "D408",
        "D409",
        "D413",
        "N813",
        "PLC0415",
        "PLC2701",
        "PLR0904",
        "PLR0912",
        "PLR0913",
        "PLR0915",
        "PLR0917",
        "PLR6301",
        "SLF001",
        "RUF012",
        "TRY003",
        "COM812",
        "COM819",
        "D206",
        "E501",
        "ISC001",
        "Q000",
        "Q001",
        "Q002",
        "Q003",
        "W191",
    ]

    [lint.flake8-quotes]
    docstring-quotes = "double"

    [lint.isort]
    lines-after-imports = 2
    force-sort-within-sections = true
    combine-as-imports = true

    [lint.per-file-ignores]
    "__init__.py" = [
        "E402",
        "I001",
    ]

    [format]
    preview = true
    docstring-code-format = true

    ````


??? info "Installing MkDocs"
    To install mkdocs:
    ```` {.bash }
    pip install mkdocs
    ````
    [More information](https://mkdocs.org/)


## Coverage

**Coverage** is used to monitor test coverage.

```` {.md }
hatch run coverage run some_module.py
````

??? quote "Config"
    ```` {.toml }
    [report]
    exclude_lines = [
        "pragma: no cover",
        "if TYPE_CHECKING:",
        "@overload",
        "except ImportError",
        "if __name__ == \"__main__\":",
    ]

    ````


??? info "Installing Coverage"
    To install coverage:
    ```` {.bash }
    pip install coverage
    ````
    [More information](https://coverage.readthedocs.io/)


## Ruff

**Ruff** is used as a linter. You can find the configuration in the
`pyproject.toml` file.


```` {.md }
hatch run ruff --help
````

??? quote "Config"
    ```` {.toml }
    line-length = 90
    extend-exclude = [
        "docs",
    ]
    target-version = "py312"

    [lint]
    preview = true
    select = [
        "A",
        "B",
        "BLE",
        "C",
        "C4",
        "COM",
        "D",
        "E",
        "EM",
        "EXE",
        "F",
        "FA",
        "FLY",
        "G",
        "I",
        "ICN",
        "INP",
        "INT",
        "ISC",
        "N",
        "PERF",
        "PIE",
        "PLE",
        "PLC",
        "PLR",
        "PT",
        "PTH",
        "PYI",
        "Q",
        "RET",
        "RSE",
        "RUF",
        "SIM",
        "SLF",
        "SLOT",
        "T10",
        "TCH",
        "TID",
        "TRY",
        "UP",
        "W",
        "YTT",
    ]
    ignore = [
        "C408",
        "B905",
        "C901",
        "D100",
        "D101",
        "D102",
        "D103",
        "D104",
        "D105",
        "D106",
        "D107",
        "D203",
        "D204",
        "D213",
        "D215",
        "D400",
        "D401",
        "D404",
        "D406",
        "D407",
        "D408",
        "D409",
        "D413",
        "N813",
        "PLC0415",
        "PLC2701",
        "PLR0904",
        "PLR0912",
        "PLR0913",
        "PLR0915",
        "PLR0917",
        "PLR6301",
        "SLF001",
        "RUF012",
        "TRY003",
        "COM812",
        "COM819",
        "D206",
        "E501",
        "ISC001",
        "Q000",
        "Q001",
        "Q002",
        "Q003",
        "W191",
    ]

    [lint.flake8-quotes]
    docstring-quotes = "double"

    [lint.isort]
    lines-after-imports = 2
    force-sort-within-sections = true
    combine-as-imports = true

    [lint.per-file-ignores]
    "__init__.py" = [
        "E402",
        "I001",
    ]

    [format]
    preview = true
    docstring-code-format = true

    ````


??? info "Installing Ruff"
    To install ruff:
    ```` {.bash }
    pip install ruff
    ````
    [More information](https://beta.ruff.rs/)


## MyPy

**MyPy** is used for type checking. You can find the configuration in the
`pyproject.toml` file.


```` {.md }
hatch run mypy --help
````

??? quote "Config"
    ```` {.toml }
    python_version = "3.12"
    disable_error_code = [
        "assignment",
        "misc",
        "import",
        "has-type",
    ]
    check_untyped_defs = true

    ````


??? info "Installing MyPy"
    To install mypy:
    ```` {.bash }
    pip install mypy
    ````
    [More information](https://mypy-lang.org)

Bases: MkTemplate

__init__

__init__(tools: list[Tool] | None = None, **kwargs: Any)

Parameters:

Name Type Description Default
tools list[Tool] | None

Tools to show install / setup instructions for. If None, tools will be pulled from project.

None
kwargs Any

Keyword arguments passed to parent

{}
graph TD
  94721312205504["mkdevtools.MkDevTools"]
  94721308869584["mktemplate.MkTemplate"]
  94721311697232["mkcontainer.MkContainer"]
  94721308848336["mknode.MkNode"]
  94721311766592["node.Node"]
  140564252373184["builtins.object"]
  94721308869584 --> 94721312205504
  94721311697232 --> 94721308869584
  94721308848336 --> 94721311697232
  94721311766592 --> 94721308848336
  140564252373184 --> 94721311766592
/home/runner/work/mknodes/mknodes/mknodes/templatenodes/mkdevtools/metadata.toml
[metadata]
icon = "mdi:wrench"
status = "new"
name = "MkDevTools"
virtual_children = true

[examples.regular]
title = "From project"
jinja = """
{{ mk.MkDevTools() }}
"""

# [examples.explicit]
# title = "Explicit"
# jinja = """
# {{ ["black"] | MkDevTools }}
# """

[output.markdown]
template = """
{% filter rstrip %}
{% for tool in node.tools %}
{{ tool.title | MkHeader }}

{{ tool.description }}

{% if tool.setup_cmd %}
{{ tool.setup_cmd | render_string | MkCode(language="md")}}

{% endif %}
{{ (tool.cfg.content or "") | MkCode(language=tool.cfg.syntax) | MkAdmonition(collapsible=True, title="Config", typ="quote") }}

{{ ["To install " ~ tool.identifier ~ ":",
    ("pip install " ~ tool.identifier) | MkCode(language="bash"),
    tool.url | MkLink("More information")] | MkAdmonition(collapsible=True, title="Installing " ~ tool.title)}}

{% endfor %}
{% endfilter %}


"""
mknodes.templatenodes.mkdevtools.MkDevTools
class MkDevTools(mktemplate.MkTemplate):
    """Node showing information about used dev tools."""

    ICON = "material/wrench"
    STATUS = "new"
    VIRTUAL_CHILDREN = True

    def __init__(
        self,
        tools: list[tools.Tool] | None = None,
        **kwargs: Any,
    ):
        """Constructor.

        Args:
            tools: Tools to show install / setup instructions for.
                            If None, tools will be pulled from project.
            kwargs: Keyword arguments passed to parent
        """
        super().__init__("output/markdown/template", **kwargs)
        self._tools = tools

    @property
    def tools(self) -> list[tools.Tool]:
        match self._tools:
            case list():
                return self._tools
            case None:
                return self.ctx.metadata.tools
            case _:
                raise TypeError(self._tools)